#pragma once

#include <iostream>
#include <vector>
#include <fstream>
#include <string>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>


class CameraCalibrator
{
public:
    CameraCalibrator();
    ~CameraCalibrator();
    //提取 文件中各个图像 指定数目 棋盘格角点
    int addChessboardPoints( cv::Size &board_size, cv::Mat imageInput );
    //添加角点到2D图像点和3D场景点坐标系中
    //    void addPoints(const std::vector<cv::Point2f> &imageCorners, const std::vector<cv::Point3f> &objectCorners);
    //进行标定，并返回投影误差(相机矩阵，畸变矩阵，旋转向量，平移向量)
    double  calibrate(cv::Size &imageSize);
    //标定后去除图像中的畸变
    cv::Mat remap(cv::Mat &imageInput, cv::Size &image_size);

private:
    std::vector< std::vector<cv::Point3f> >objectPoints;  //存储世界坐标点
    std::vector< std::vector<cv::Point2f> >imagePoints;  //存储像素坐标点
    //    std::vector<std::vector<cv::Point2f>> image_points_seq; // 保存检测到的所有角点
    cv::Mat  cameraMatrix;  //输出相机矩阵
    cv::Mat  distCoeffs;    //输出畸变矩阵

    int flag;  //标定方式
    cv::Mat mapx, mapy;  //去图像畸变的x y 映射函数
    cv::Mat R = cv::Mat::eye(3,3,CV_32F);
    bool mustInitUndistort;  //是否初始化失真

};

